﻿using System;
using System.Data;
using System.Collections.Generic;
//using System.Threading.Tasks;

namespace Licens.Class
{
    public class Keys
    {
        string _kitubatdau = "";
        /// <summary>
        /// Ki tu ascii bat dau trong chuoi.
        /// </summary>
        public string pKiTuBatDau
        {
            get
            {
                try
                {
                    return _kitubatdau.Substring(0, 1);
                }
                catch { return "";}
            }
            set { _kitubatdau = value.ToString(); f_TaoDBIndex(); }
        }
        string _ssongay = "";
        /// <summary>
        /// Số ngày sử dụng của key.
        /// </summary>
        public int pSoNgaySuDung
        {
            get { return Convert.ToInt32(_ssongay); }
            set { _ssongay = value.ToString().PadLeft(3,'0'); }
        }
        string _sngaybatdau = "";
        /// <summary>
        /// Ngày bắt đầu sử dụng của key(dd/MM/yyyy).
        /// </summary>
        public string pNgayBatDauSuDung
        {
            get { return _sngaybatdau; }
            set { _sngaybatdau = value; }
        }
        string _slanthu = "";
        /// <summary>
        /// Key được sử dụng lần thứ bao nhiêu.
        /// </summary>
        public int pLanThu
        {
            get { return Convert.ToInt32(_slanthu); }
            set { _slanthu = value.ToString().PadLeft(2,'0'); }
        }
        string _sstt = "";
        /// <summary>
        /// Số thứ tự của key.
        /// </summary>
        public int pSTT
        {
            get { return Convert.ToInt32(_sstt); }
            set { _sstt = value.ToString().PadLeft(4,'0'); }
        }
        string _sidpro = "";
        /// <summary>
        /// ID phần mềm đăng ký sử dụng.
        /// </summary>
        public int pIDChuongTrinh
        {
            get { return Convert.ToInt32(_sidpro); }
            set { _sidpro = value.ToString().PadLeft(2, '0'); }
        }
        string _keystring = "";
        DataTable _dtindex = new DataTable();
        DataTable _dtvitriNumCod = new DataTable();
        DataTable _dtvitri = new DataTable();
        /// <summary>
        /// Khởi tạo class key.
        /// </summary>
        public Keys()
        {
            f_khoitao();
        }
        /// <summary>
        /// Khởi tạo class key.
        /// </summary>
        /// <param name="sKeyString">Chuỗi Keys.</param>
        public Keys(string sKeyString)
        {
            _keystring = sKeyString;
            f_khoitao();
        }
        /// <summary>
        /// Tạo table chỉ số chứa các kí tự.
        /// </summary>
        void f_TaoDBIndex()
        {
            if (_kitubatdau != "")
                _dtindex = SystemInfo.GetDataCharFromASCII(Convert.ToChar(_kitubatdau));
            else
                _dtindex = SystemInfo.GetDataCharFromASCII();
        }
        /// <summary>
        /// Khởi tạo mặc định các giá trị của class.
        /// </summary>
        void f_khoitao()
        {
            this._dtvitri = new DataTable();
            this._dtvitri.Columns.Add("id", typeof(int));
            this._dtvitri.Columns.Add("ten");
            for (int i = 0; i <= 28; i++)
            {
                this._dtvitri.Rows.Add(new object[] { i, "" });
            }
            this._dtvitriNumCod = new DataTable();
            this._dtvitriNumCod.Columns.Add("id", typeof(int));
            this._dtvitriNumCod.Columns.Add("ten");
            for (int i = 0; i < 18; i++)
            {
                this._dtvitriNumCod.Rows.Add(new object[] { i, "" });
            }
            if (_keystring != "")
            {
                try
                {
                    _kitubatdau = _keystring.Substring(enViTri.cha1.GetHashCode(), 1);
                    f_TaoDBIndex();
                    string vnumber = f_convertToNumber(_keystring);
                    _sidpro = vnumber.Substring(enViTri.pro1.GetHashCode(), 1) + vnumber.Substring(enViTri.pro2.GetHashCode(), 1);
                    _slanthu = vnumber.Substring(enViTri.lan1.GetHashCode(), 1) + vnumber.Substring(enViTri.lan2.GetHashCode(), 1);
                    _sngaybatdau = vnumber.Substring(enViTri.ngaybd1.GetHashCode(), 1) + vnumber.Substring(enViTri.ngaybd2.GetHashCode(), 1)
                        + "/" + vnumber.Substring(enViTri.thangbd1.GetHashCode(), 1) + vnumber.Substring(enViTri.thangbd2.GetHashCode(), 1)
                        + "/20" + vnumber.Substring(enViTri.nambd1.GetHashCode(), 1) + vnumber.Substring(enViTri.nambd2.GetHashCode(), 1);
                    _ssongay = vnumber.Substring(enViTri.songay1.GetHashCode(), 1) + vnumber.Substring(enViTri.songay2.GetHashCode(), 1) + vnumber.Substring(enViTri.songay3.GetHashCode(), 1);
                    _sstt = vnumber.Substring(enViTri.tt1.GetHashCode(), 1) + vnumber.Substring(enViTri.tt2.GetHashCode(), 1) + vnumber.Substring(enViTri.tt3.GetHashCode(), 1) + vnumber.Substring(enViTri.tt4.GetHashCode(), 1);
                }
                catch { return; }
            }
            else
            {
                _sidpro = "01";
                _slanthu = "01";
                _sngaybatdau = DateTime.Now.ToString("dd/MM/yyyy");
                _ssongay = "030";
                _sstt = "0001";
                f_TaoDBIndex();
            }
            
            
        }
        /// <summary>
        /// Đổi kiểu kí tự sang kiểu số.
        /// </summary>
        /// <param name="sfinal">Kí tự cần chuyển.</param>
        /// <returns></returns>
        public string f_convertToNumber(string sfinal)
        {
            sfinal = sfinal.ToUpper();
            for (int i = 0; i < sfinal.Length; i++)
            {
                if (!char.IsDigit(sfinal[i])&&sfinal[i]!='-')
                {
                    
                    sfinal = sfinal+ this._dtindex.Select("kitu='" + sfinal[i] + "'")[0][0].ToString();
                }
            }
            return sfinal;
        }
        /// <summary>
        /// Đổi kiểu số sang kiểu kí tự.
        /// </summary>
        /// <param name="snumber">Số cần chuyển.</param>
        /// <returns></returns>
        public string f_convertToKey(string snumber)
        {
            string vstam = "";
            for (int i = 0; i < snumber.Length; i++)
            {
                if (char.IsDigit(snumber[i]))
                {

                    vstam += this._dtindex.Select("so=" + snumber[i].ToString() + "")[0][1].ToString();
                }
            }
            return vstam;
        }
        string f_get_NumberCode(string key)
        {
            string vnumber = "";
            _kitubatdau = key.Substring(enViTri.cha1.GetHashCode(), 1);
            f_TaoDBIndex();
            return vnumber;
        }
        /// <summary>
        /// Tạo key theo các thuộc tính đã gán sẵn giá trị.
        /// </summary>
        /// <returns></returns>
        public string f_CreateKey()
        {
            //string str = "";
            string vs_songay = _ssongay;
            string vs_stt = _sstt;
            string vs_x = "";
            vs_x = f_CreateRandomNumber;
            this._dtvitri.Select("id=" + enViTri.cha1.GetHashCode())[0][1] = "0";
            this._dtvitri.Select("id=" + enViTri.lan1.GetHashCode())[0][1] = _slanthu.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.lan2.GetHashCode())[0][1] = _slanthu.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.pro1.GetHashCode())[0][1] = _sidpro.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.pro2.GetHashCode())[0][1] = _sidpro.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.tt1.GetHashCode())[0][1] = vs_stt.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.tt2.GetHashCode())[0][1] = vs_stt.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.tt3.GetHashCode())[0][1] = vs_stt.Substring(2, 1);
            this._dtvitri.Select("id=" + enViTri.tt4.GetHashCode())[0][1] = vs_stt.Substring(3, 1);
            this._dtvitri.Select("id=" + enViTri.x1.GetHashCode())[0][1] = vs_x.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.x2.GetHashCode())[0][1] = vs_x.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.x3.GetHashCode())[0][1] = vs_x.Substring(2, 1);
            this._dtvitri.Select("id=" + enViTri.x4.GetHashCode())[0][1] = vs_x.Substring(3, 1);
            this._dtvitri.Select("id=" + enViTri.x5.GetHashCode())[0][1] = vs_x.Substring(4, 1);
            this._dtvitri.Select("id=" + enViTri.x6.GetHashCode())[0][1] = vs_x.Substring(5, 1);
            this._dtvitri.Select("id=" + enViTri.x7.GetHashCode())[0][1] = vs_x.Substring(6, 1);
            this._dtvitri.Select("id=" + enViTri.songay1.GetHashCode())[0][1] = vs_songay.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.songay2.GetHashCode())[0][1] = vs_songay.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.songay3.GetHashCode())[0][1] = vs_songay.Substring(2, 1);
            this._dtvitri.Select("id=" + enViTri.ngaybd1.GetHashCode())[0][1] = _sngaybatdau.Substring(0, 1);
            this._dtvitri.Select("id=" + enViTri.ngaybd2.GetHashCode())[0][1] = _sngaybatdau.Substring(1, 1);
            this._dtvitri.Select("id=" + enViTri.thangbd1.GetHashCode())[0][1] = _sngaybatdau.Substring(3, 1);
            this._dtvitri.Select("id=" + enViTri.thangbd2.GetHashCode())[0][1] = _sngaybatdau.Substring(4, 1);
            this._dtvitri.Select("id=" + enViTri.nambd1.GetHashCode())[0][1] = _sngaybatdau.Substring(8, 1);
            this._dtvitri.Select("id=" + enViTri.nambd2.GetHashCode())[0][1] = _sngaybatdau.Substring(9, 1);
            string str = "";
            for (int i = 0; i < this._dtvitri.Rows.Count; i++)
            {
                if (this._dtvitri.Rows[i][1].ToString() == "")
                {
                    str = str + "-";
                }
                else
                {
                    str = str + this._dtindex.Select("so=" + int.Parse(this._dtvitri.Rows[i][1].ToString()))[0][1].ToString();
                }
            }
            return str;
        }
        /// <summary>
        /// Tạo số ngẫu nhiên.
        /// </summary>
        string f_CreateRandomNumber
        {
            get
            {
                string vsxxx = "";
                while (vsxxx == "")
                {
                    try
                    {
                        vsxxx = DateTime.Now.Ticks.ToString();//lấy thời gian hiện tại ngẫu nhiên.
                        vsxxx = vsxxx.Substring(vsxxx.Length - 10);//lấy 7 kí tự cuối.
                    }
                    catch { vsxxx = ""; }
                }
                return vsxxx;
            }
        }
        /// <summary>
        /// Tạo mã số để cấp Keys theo tham số đã truyền vào.
        /// </summary>
        /// <returns></returns>
        public string f_CreateCodeNumber()
        {
            string vsma = "";
            string vsxxx = f_CreateRandomNumber;
            vsma = _slanthu//ff
                + _sngaybatdau.Substring(8, 1)//d
                + _sstt.Substring(0, 2)//aa
                + vsxxx.Substring(0, 1)//x

                + _sngaybatdau.Substring(0, 1)//b
                + _sstt.Substring(2, 2)//aa
                + vsxxx.Substring(1, 1)//x
                + _sngaybatdau.Substring(9, 1)//d
                + _sngaybatdau.Substring(3, 1)//c

                + _sidpro//hh
                + _sngaybatdau.Substring(4, 1)//b
                + vsxxx.Substring(3, 2)//xx
                + _sngaybatdau.Substring(1, 1)//b
                ;
            return vsma;
        }
        /// <summary>
        /// Tạo mã số để cấp Keys theo tham số đã truyền vào.
        /// </summary>
        /// <returns></returns>
        public bool f_CheckCodeNumber(string codeNumber,int idProgram)
        {
            
            string vngaybatdau = "";
            
            
            try
            {
                if (int.Parse(codeNumber.Substring(enViTriNumCod.lanthu1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.lanthu2.GetHashCode(), 1)) == 0) return false;
            }
            catch { return false; }
            try
            {
                vngaybatdau = codeNumber.Substring(enViTriNumCod.ngaybd1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.ngaybd2.GetHashCode(), 1);
                vngaybatdau +="/"+ codeNumber.Substring(enViTriNumCod.thangbd1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.thangbd2.GetHashCode(), 1);
                vngaybatdau +="/20"+ codeNumber.Substring(enViTriNumCod.nambd1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.nambd2.GetHashCode(), 1);
                DateTime vdatetmp = new DateTime(int.Parse(vngaybatdau.Substring(6, 4)), int.Parse(vngaybatdau.Substring(3, 2)), int.Parse(vngaybatdau.Substring(0, 2)));
            }
            catch { return false; }
            try
            {
                if (int.Parse(codeNumber.Substring(enViTriNumCod.stt1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.stt2.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.stt3.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.stt4.GetHashCode(), 1)) == 0) return false;
            }
            catch { return false; }
            try
            {
                if (int.Parse(codeNumber.Substring(enViTriNumCod.idpro1.GetHashCode(), 1) + codeNumber.Substring(enViTriNumCod.idpro2.GetHashCode(), 1)) != idProgram) return false;
            }
            catch { return false; }
           
            return true;
        }
        enum enViTriNumCod
        {
            lanthu1 = 0, lanthu2 = 1, nambd1 = 2, stt1 = 3, stt2 = 4, xxx1 = 5
            ,ngaybd1=6,stt3=7,stt4=8,xxx3=9,nambd2=10,thangbd1=11
            ,idpro1=12,idpro2=13,thangbd2=14,xxx4=15,xxx5=16,ngaybd2=17
        }
        private enum enViTri
        {
            //xgxhx-habcd-axfbe-cdxfa-xaexe
            x1 = 0
            ,
            x2 = 2
                ,
            x3 = 4
                ,
            x4 = 13
                ,
            x5 = 20
                ,
            x6 = 24
                ,
            x7 = 27

                ,
            cha1 = 1

                ,
            pro1 = 3
                ,
            pro2 = 6

                ,
            tt1 = 7
                ,
            tt2 = 12
                ,
            tt3 = 22
                ,
            tt4 = 25

                ,
            ngaybd1 = 8
                ,
            ngaybd2 = 15

                ,
            thangbd1 = 9
                ,
            thangbd2 = 18

                ,
            nambd1 = 10
                ,
            nambd2 = 19

                ,
            lan1 = 14
                ,
            lan2 = 21


                ,
            songay1 = 16
                , songay2 = 26,
            songay3 = 28


        }
    }
}
